package org.apli.haiam.admin.jsf.managed;

import com.apli.controladores.Aplinfo;
import com.apli.controladores.AplinfoFactoryBean;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmDatosGlobales;
import org.apli.haiam.ejb.entidades.AdmDivisionPolitica;
import org.apli.haiam.ejb.entidades.AdmPermiso;
import org.apli.haiam.ejb.entidades.AdmTipoConsulta;
import org.apli.haiam.ejb.entidades.AdmUsuario;
import org.apli.haiam.ejb.entidades.CexAgenda;
import org.apli.haiam.ejb.entidades.CexDia;
import org.apli.haiam.ejb.entidades.CexEspecialidad;
import org.apli.haiam.ejb.entidades.CexEspecialidadMedico;
import org.apli.haiam.ejb.entidades.CexHistoriaClinica;
import org.apli.haiam.ejb.entidades.CexHorario;
import org.apli.haiam.ejb.entidades.CexHorariosDia;
import org.apli.haiam.ejb.entidades.CexPreparacion;
import org.apli.haiam.ejb.interfaces.AdministradorHaiam;
import org.apli.haiam.ejb.interfaces.ConsExternaAdministrador;
import org.apli.jsf.managed.JsfBean;
import org.primefaces.event.RowEditEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexEspecialidadMedico.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfEnvioRecepcion extends JsfBean<CexEspecialidadMedico> {

    final Logger log = LoggerFactory.getLogger(JsfEnvioRecepcion.class);
    private CexEspecialidad especialidad;
    private CexEspecialidad subEspecialidad;
    private List<CexHorariosDia> listaHorarioDia;
    private UsuarioAdmin user;
    private List<AdmDatosGlobales> listaDatosGlobales;
    private Date fechaAgenda;
    private AdmDivisionPolitica provincia;
    private AdmDivisionPolitica canton;
    private AdmDivisionPolitica parroquia;
    private List<AdmDatosGlobales> listaImpresorasturnos;
    private List<CexAgenda> listaHistorialTurnos;
    private Calendar c1;
    private Integer dia;
    private AdmTipoConsulta admTipoConsulta;
    private AdmUsuario admUsuario;
    private List<CexAgenda> listaAgenda;
    private static final String TIPO_IMPRESORAS = "IMP_TMU220D";
    private static final String NAME_REPORTE = "RPT_TURNO.jasper";
    private static final String TIPO_REPORTE_PDF = "application/pdf";
    private static final String TIPO_REPORTE_EXC = "application/vnd.ms-excel";

    // private AdmSistema sistemaSeleccionado;
    /**
     * Constructor por defecto.
     */
    public JsfEnvioRecepcion() {
        // sistemaSeleccionado = new AdmSistema();
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new CexEspecialidadMedico();
        especialidad = new CexEspecialidad();
        listaHorarioDia = new ArrayList<>();
        subEspecialidad = new CexEspecialidad();
        fechaAgenda = new Date();
        provincia = new AdmDivisionPolitica();
        canton = new AdmDivisionPolitica();
        parroquia = new AdmDivisionPolitica();
        c1 = Calendar.getInstance();
        dia = 0;
        listaAgenda = new ArrayList<>();
        try {
            user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
            admUsuario = user.getUser();
            listaDatosGlobales = adminObject.listar(AdmDatosGlobales.class, "estado", 1);
            if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(4)) {
                admTipoConsulta = (AdmTipoConsulta) adminObject.buscar(AdmTipoConsulta.class, "atcId", 2);
            } else if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(2)) {
                admTipoConsulta = (AdmTipoConsulta) adminObject.buscar(AdmTipoConsulta.class, "atcId", 1);
            } else if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(1) || !user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(3)) {
                admTipoConsulta = (AdmTipoConsulta) adminObject.buscar(AdmTipoConsulta.class, "atcId", 1);
            }
            cargarImpresoraTurnos();
        } catch (Exception e) {
            log.error("inicializar() {} ", e.getMessage());
        }

    }

    /**
     * Carga en la lista las impresoras para la impresion de stickers
     */
    public void cargarImpresoraTurnos() {
        listaImpresorasturnos = new ArrayList<>();
        for (AdmDatosGlobales datosGlobales : listaDatosGlobales) {
            if (datosGlobales.getTipo().equals(TIPO_IMPRESORAS)) {
                listaImpresorasturnos.add(datosGlobales);
            }
        }
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {

        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
//        try {
//            List<CexTurnosEnc> datos = admin.listarOrdenada(object.getClass(), "nombre", true);
//            List<SelectItem> items = new ArrayList<SelectItem>();
//            for (CexTurnosEnc obj : datos) {
//                items.add(new SelectItem(obj, obj.get));
//            }
//            return items;
//        } catch (Exception e) {
//            log.error("getSelectedItem() {} ", e.getMessage());
//        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    public List<SelectItem> getSelectedItemEspe() {
        try {
            //listaHorarioDia = new ArrayList<CexTurnosDet>();
            //detalle.setCexMedico(null);

            List<CexEspecialidad> listEspecialidad = adminObject.listarNullOrdenada(CexEspecialidad.class, "cexEspecialidad", "cesEstado", 1, "cesNombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidad obj : listEspecialidad) {
                // if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento() == 2 || user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento() == 1) {
                items.add(new SelectItem(obj, obj.getCesNombre()));
                // } else if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento() == 3) {
                //      if (obj.getCesId().equals(12)) {
                // items.add(new SelectItem(obj, obj.getCesNombre()));
                //    }
                // }

            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemEspe() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    public List<SelectItem> getSelectedItemSubespecialidad() {
        try {
            //listaHorarioDia = new ArrayList<CexTurnosDet>();
            //detalle.setCexMedico(null);
            //List<CexEspecialidad> subespecialidad = adminObject.listarOrdenada(CexEspecialidad.class, "cexEspecialidad", especialidad, "cesEstado", 1, "cesNombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidad obj : especialidad.getCexEspecialidadList()) {
                if (obj.getCesEstado().equals(1)) {
                    items.add(new SelectItem(obj, obj.getCesNombre()));
                }
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemSubespecialidad() {} ", e.getMessage());
        }
        return null;
    }

    public List<SelectItem> getSelectedItemMedico() {
        try {
            c1 = Calendar.getInstance();
            c1.setTime(fechaAgenda);
            dia = c1.get(Calendar.DAY_OF_WEEK);
            List<CexEspecialidadMedico> listEspMed = new ArrayList<>();
            // lista los horarios pertenecientes al emdico de acuerdo a la especialidad
            //List<CexHorario> listaHorario1 = adminObject.listarOrdenada(CexHorario.class, "cexEspecialidadMedico.cexEspecialidad", subEspecialidad, "admTipoConsulta", admTipoConsulta, "choId", true);
            // Filtra los horarios segun el dia actual
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidadMedico cexEspMed : subEspecialidad.getCexEspecialidadMedicoList()) {
                for (CexHorario cexHorario : cexEspMed.getCexHorarioList()) {
                    if (cexHorario.getAdmTipoConsulta().equals(admTipoConsulta)) {
                        for (CexHorariosDia cexHorarioDia1 : cexHorario.getCexHorariosDiaList()) {
                            //Validar que sea el dia actual
                            if (cexHorarioDia1.getCexDia().getCdiId().equals(dia)) {
                                if (cexHorarioDia1.getChdHoraInicioAm() != null || cexHorarioDia1.getChdHoraFinAm() != null) {
                                    if (cexHorarioDia1.getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeEstado() == 1) {
                                        if (!listEspMed.contains(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico())) {
                                            items.add(new SelectItem(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico(), cexHorarioDia1.getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeNombreFull()));
                                            listEspMed.add(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico());
                                        }
                                    }
                                }
                            }
                        }
                    }

                }
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemMedico() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Metodo que busca segun la especialidad , el Doctor y el horario que tiene
     * asignado cada doctor el turno mas cerca dispible
     *
     * @author David Carranza
     */
    public void buscarTurnoListener() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        int contHor = 0;
        listaHorarioDia.clear();
        listaAgenda.clear();
        List<CexAgenda> listTempAgen;
        try {

            //Recupera permiso para saber si se puede agendar en la fecha seleccionada
            List<AdmPermiso> objLicencia = (List<AdmPermiso>) adminObject.queryEJB("select p from AdmPermiso p where :var1 between p.apeFechaInicio and p.apeFechaFin and p.admMedico = :var2", fechaAgenda, object.getAdmMedico());
            //List<CexPermiso> objLicencia = adminObject.ejecutarQueryNativoLista("SELECT * FROM cex_Permiso where med_id = " + object.getCexHorario().getCexEspecialidadMedico().getCexMedico().getMedId() + " and date('" + fecha + "') between per_fecha_inicio and per_fecha_fin;", CexPermiso.class);
            //Verifica si tiene permiso
            if (objLicencia.size() < 0 || objLicencia.isEmpty()) {
                //Recuper la lista del horario de acuerdo al dia seleciconado
                for (CexHorario objTemH : object.getCexHorarioList()) {
                    //Verificar los horarios segun el tipo de consulta de la agenda
                    if (objTemH.getAdmTipoConsulta().equals(admTipoConsulta)) {
                        //Recorrer los horarios dias de cada horario
                        for (CexHorariosDia objTemHd : objTemH.getCexHorariosDiaList()) {
                            if (objTemHd.getCexDia().getCdiId().equals(dia)) {
                                //Añadir solo el horario que tenga asignado hora inicio y hora fin
                                //if (objTemHd.getChdHoraInicioAm() != null && objTemHd.getChdHoraFinAm() != null) {
                                listaHorarioDia.add(objTemHd);
                                // }
                            }
                        }
                    }
                }

                //Recuperar las agendas de acuerdo al horarioDia y de acuerdo a las fechas
                for (CexHorariosDia objHorDia : listaHorarioDia) {
                    //Asignar numero de horario
                    objHorDia.setOrdenHorario(contHor);
                    listTempAgen = adminObject.listarOrdenada(CexAgenda.class, "cagFecha", fechaAgenda, "cexHorariosDia", objHorDia, "cagSecuencia", true);
                    for (CexAgenda objA : listTempAgen) {
                        objA.setNumeroHorario(contHor);
                        listaAgenda.add(objA);
                    }
                    listTempAgen.clear();
                    contHor++;
                }

            } else {
                AdmPermiso permiso = objLicencia.get(0);
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Agenda no disponible", "Médico no disponible en la fecha ha seleccioanda por motico de " + permiso.getApeMotivo() + ""));
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    public void onRowEdit(RowEditEvent event) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            CexAgenda objAgen = (CexAgenda) event.getObject();
            adminObject.modificar(objAgen, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    public void onRowCancel(RowEditEvent event) {
        FacesMessage msg = new FacesMessage("Edit Cancelled", ((CexAgenda) event.getObject()).getCagObservacion());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    /*
     * Metodo que imprime directamente en una impresra byte
     */
    public void print(CexAgenda turno) throws IOException {
        //FileInputStream inputStream = null;
        InputStream tex = null;
        SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
        String fecha = sf.format(turno.getCagFecha());
        SimpleDateFormat sfHora = new SimpleDateFormat("HH:mm");
        String hora = "";
        if (turno.getCagHora() != null) {
            hora = sfHora.format(turno.getCagHora());
        }
        String impresora = "SIN IMPRESORA";
        PrintService impresora11 = null;

        try {
            //inputStream = new FileInputStream("e:/archivo.txt");

            String cadena = "************************************* \n\n"
                    + "RESPONSABLE: " + turno.getCagNombreUsuario() + " \n"
                    + "FECHA: " + fecha + " \n"
                    + turno.getCagNombreInstitucion() + "\n"
                    + turno.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico().getCexEspecialidad().getCesNombre() + "\n"
                    + "NÚMERO CARPETA: " + turno.getCexHistoriaClinica().getChcHistoriaClinica() + "\n"
                    + "CÉDULA: " + turno.getCexHistoriaClinica().getChcCedula() + "\n"
                    + "TURNO: " + turno.getCagSecuencia() + "\t HORA: " + hora + " \n"
                    + "MEDICO: " + turno.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeNombreFull() + "\n"
                    + "PACIENTE: " + turno.getCexHistoriaClinica().getChcNombreFull() + "\n"
                    + "***************************************\n"
                    + "\n"
                    + "\n"
                    + "SE RECOMIENDA ESTAR 30 MIN ANTES\n"
                    + " DE LA HORA ESPECIFICADA\n"
                    + "\n";
            String te2 = converteCaracter(cadena);
            tex = new ByteArrayInputStream(te2.getBytes("UTF-8"));

        } catch (UnsupportedEncodingException e) {
            log.error("printExtra() {} ", e.getMessage());
        }
        if (tex == null) {
            return;
        }

        DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc document = new SimpleDoc(tex, docFormat, null);

        PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();

        for (AdmDatosGlobales datoGlobal : listaImpresorasturnos) {
            if (user.getIp().equals(datoGlobal.getClave())) {
                impresora = datoGlobal.getValor();
                break;
            }
        }
        ////       impresora11 = PrintServiceLookup.lookupDefaultPrintService();
        PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, null);
        for (PrintService printService1 : printService) {
            if (printService1.getName().equals(impresora)) {
                impresora11 = printService1;
            }
        }

        if (impresora11 != null) {
            DocPrintJob printJob = impresora11.createPrintJob();
            try {

                printJob.print(document, attributeSet);
            } catch (PrintException e) {
                log.error("printExtra() {} ", e.getMessage());
            }
        } else {
            log.error("No existen impresoras instaladas");
            for (PrintService printService1 : printService) {
                log.error(printService1.getName());
            }

        }

        tex.close();
    }

    /*
     * Metodo que imprime una lista de turnos directamente en una impresra byte
     */
    public void printLista(List<CexHorariosDia> listaTurno) throws IOException {
        //FileInputStream inputStream = null;
        InputStream tex = null;
        SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
        String fecha;
        SimpleDateFormat sfHora = new SimpleDateFormat("HH:mm");
        String hora = "";
        String te2;
        DocFlavor docFormat;
        Doc document;
        DocPrintJob printJob;
        PrintService impresora11 = null;
        String impresora = "SIN IMPRESORA";
        for (CexHorariosDia horD : listaTurno) {
            for (CexAgenda turno : horD.getCexAgendaList()) {
                if (turno.isSeleccionado()) {

                    fecha = sf.format(turno.getCagFecha());
                    try {

                        if (turno.getCagHora() != null) {
                            hora = sfHora.format(turno.getCagHora());
                        }

                        //inputStream = new FileInputStream("e:/archivo.txt");
                        String cadena = "************************************* \n\n"
                                + "RESPONSABLE: " + turno.getCagNombreUsuario() + " \n"
                                + "FECHA: " + fecha + " \n"
                                + turno.getCagNombreInstitucion() + "\n"
                                + turno.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico().getCexEspecialidad().getCesNombre() + "\n"
                                + "NÚMERO CARPETA: " + turno.getCexHistoriaClinica().getChcHistoriaClinica() + "\n"
                                + "CÉDULA: " + turno.getCexHistoriaClinica().getChcCedula() + "\n"
                                + "TURNO: " + turno.getCagSecuencia() + "\t HORA: " + hora + " \n"
                                + "MEDICO: " + turno.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeNombreFull() + "\n"
                                + "PACIENTE: " + turno.getCexHistoriaClinica().getChcNombreFull() + "\n"
                                + "***************************************\n"
                                + "\n"
                                + "\n"
                                + "SE RECOMIENDA ESTAR 30 MIN ANTES\n"
                                + " DE LA HORA ESPECIFICADA\n"
                                + "\n";
                        te2 = converteCaracter(cadena);
                        tex = new ByteArrayInputStream(te2.getBytes("UTF-8"));

                    } catch (UnsupportedEncodingException e) {
                        log.error("printExtra() {} ", e.getMessage());
                    }
                    if (tex == null) {
                        return;
                    }

                    docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
                    document = new SimpleDoc(tex, docFormat, null);

                    PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();

                    for (AdmDatosGlobales datoGlobal : listaImpresorasturnos) {
                        if (user.getIp().equals(datoGlobal.getClave())) {
                            impresora = datoGlobal.getValor();
                            break;
                        }
                    }
                    //   impresora11 = PrintServiceLookup.lookupDefaultPrintService();
                    PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, null);
                    for (PrintService printService1 : printService) {
                        if (printService1.getName().equals(impresora)) {
                            impresora11 = printService1;
                        }
                    }

                    if (impresora11 != null) {
                        printJob = impresora11.createPrintJob();
                        try {

                            printJob.print(document, attributeSet);
                        } catch (PrintException e) {
                            log.error("printExtra() {} ", e.getMessage());
                        }
                    } else {
                        log.error("No existen impresoras instaladas");
                        for (PrintService printService1 : printService) {
                            log.error(printService1.getName());
                        }

                    }

                    tex.close();
                }
            }
        }
    }

    private static String converteCaracter(String linha) throws IOException {
        String texto = "";

        //Ç     128    ×       158   +       188     +       218    °       248  
        //ü     129    ?       159   ¢       189     _       219    ¨       249  
        //é     130    á       160   ¥       190     _       220    ·       250  
        //â     131    í       161   +       191     ¦       221    ¹       251  
        //ä     132    ó       162   +       192     Ì       222    ³       252  
        //à     133    ú       163   -       193     _       223    ²       253  
        //å     134    ñ       164   -       194     Ó       224    _       254  
        //ç     135    Ñ       165   +       195     ß       225            255  
        //ê     136    ª       166   -       196     Ô       226  
        //ë     137    º       167   +       197     Ò       227  
        //è     138    ¿       168   ã       198     õ       228  
        //ï     139    ®       169   Ã       199     Õ       229  
        //î     140    ¬       170   +       200     µ       230  
        //ì     141    ½       171   +       201     Þ       231  
        //Ä     142    ¼       172   -       202     Þ       232  
        //Å     143    ¡       173   -       203     Ú       233  
        //É     144    «       174   ¦       204     Û       234  
        //æ       145    »       175   -       205     Ù       235  
        //Æ       146    _       176   +       206     ý       236  
        //ô       147    _       177   ¤       207     Ý       237  
        //ö       148    _       178   ð       208     ¯       238  
        //ò       149    ¦       179   Ð       209     ´       239  
        //û       150    ¦       180   Ê       210     ­       240  
        //ù       151    Á       181   Ë       211     ±       241  
        //ÿ       152    Â       182   È       212     _       242  
        //Ö       153    À       183   i       213     ¾       243  
        //Ü       154    ©       184   Í       214     ¶       244  
        //ø       155    ¦       185   Î       215     §       245  
        //£       156    ¦       186   Ï       216     ÷       246  
        //Ø       157    +       187   +       217     ¸       247}  
        for (Character c : linha.toCharArray()) {
            switch (c) {
                case 'á':
                    c = 'a';
                    break;
                case 'é':
                    c = 'e';
                    break;
                case 'í':
                    c = 'i';
                    break;
                case 'ó':
                    c = 'o';
                    break;
                case 'ú':
                    c = 'u';
                    break;
                case 'Á':
                    c = 'A';
                    break;
                case 'É':
                    c = 'E';
                    break;
                case 'Í':
                    c = 'I';
                    break;
                case 'Ó':
                    c = 'O';
                    break;
                case 'Ú':
                    c = 'U';
                    break;
                case 'ñ':
                    c = 'n';
                    break;
                case 'Ñ':
                    c = 'N';
                    break;
            }
            texto = (texto + c);
        }
        return texto;
    }

    /*
     * Metodo que imprime directamente en una impresra byte
     */
    public void printExtra(CexAgenda turno) throws IOException {
        //FileInputStream inputStream = null;
        InputStream tex = null;
        SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
        String fecha = sf.format(turno.getCagFecha());
        SimpleDateFormat sfHora = new SimpleDateFormat("HH:mm");
        String hora = "";
        String te2;
        if (turno.getCagHora() != null) {
            hora = sfHora.format(turno.getCagHora());
        }
        String impresora = "SIN IMPRESORA";
        PrintService impresora11 = null;
        try {
            //inputStream = new FileInputStream("e:/archivo.txt");

            String cadena = "************************************* \n\n"
                    + "RESPONSABLE: " + turno.getCagNombreUsuario() + " \n"
                    + "FECHA: " + fecha + " \n"
                    + turno.getCagNombreInstitucion() + "\n"
                    + turno.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico().getCexEspecialidad().getCesNombre() + "\n"
                    + "HISTORIA CLINICA: " + turno.getCexHistoriaClinica().getChcHistoriaClinica() + "\n"
                    + "TURNO: " + turno.getCagSecuencia() + "\t HORA: " + hora + " \n"
                    + "MEDICO: " + turno.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeNombreFull() + "\n"
                    + "PACIENTE: " + turno.getCexHistoriaClinica().getChcNombreFull() + "\n"
                    + "*******   TURNO        EXTRA    ********\n"
                    + "\n"
                    + "\n"
                    + "SE RECOMIENDA ESTAR 30 MIN ANTES\n"
                    + " DE LA HORA ESPECIFICADA\n"
                    + "\n";
            te2 = converteCaracter(cadena);
            tex = new ByteArrayInputStream(te2.getBytes("UTF-8"));

        } catch (UnsupportedEncodingException e) {
            log.error("printExtra() {} ", e.getMessage());
        }
        if (tex == null) {
            return;
        }

        DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc document = new SimpleDoc(tex, docFormat, null);

        PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();

        for (AdmDatosGlobales datoGlobal : listaImpresorasturnos) {
            if (user.getIp().equals(datoGlobal.getClave())) {
                impresora = datoGlobal.getValor();
                break;
            }
        }
        // PrintService impresora11 = PrintServiceLookup.lookupDefaultPrintService();
        PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, null);
        for (PrintService printService1 : printService) {
            if (printService1.getName().equals(impresora)) {
                impresora11 = printService1;
            }
        }

        if (impresora11 != null) {
            DocPrintJob printJob = impresora11.createPrintJob();
            try {
                printJob.print(document, attributeSet);
            } catch (PrintException e) {
                log.error("printExtra() {} ", e.getMessage());
            }
        } else {
            log.error("No existen impresoras instaladas");
        }

        tex.close();
    }

    public List<SelectItem> getSelectedItemProvincia() {
        try {
            List<AdmDivisionPolitica> datos = admin.listarNullOrdenada(AdmDivisionPolitica.class, "admDivisionPolitica", "nombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (AdmDivisionPolitica obj : datos) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemProvincia() {} ", e.getMessage());
        }
        return null;
    }

    public List<SelectItem> getSelectedItemCanton() {
        try {

            List<SelectItem> items = new ArrayList<>();
            for (AdmDivisionPolitica obj : provincia.getAdmDivisionPoliticaList()) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemCanton() {} ", e.getMessage());
        }
        return null;
    }

    public List<SelectItem> getSelectedItemParroquia() {
        try {
            List<SelectItem> items = new ArrayList<>();
            for (AdmDivisionPolitica obj : canton.getAdmDivisionPoliticaList()) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemParroquia() {} ", e.getMessage());
        }
        return null;
    }

    @Override
    public DataModel<CexEspecialidadMedico> getDataModel() {
        return null;
    }

    public CexEspecialidad getEspecialidad() {
        return especialidad;
    }

  

    public void setEspecialidad(CexEspecialidad especialidad) {
        this.especialidad = especialidad;
    }

    public CexEspecialidad getSubEspecialidad() {
        return subEspecialidad;
    }

    public void setSubEspecialidad(CexEspecialidad subEspecialidad) {
        this.subEspecialidad = subEspecialidad;
    }

   

    public Date getFechaAgenda() {
        return fechaAgenda;
    }

    public void setFechaAgenda(Date fechaAgenda) {
        this.fechaAgenda = fechaAgenda;
    }

  
    public AdmDivisionPolitica getProvincia() {
        return provincia;
    }

    public void setProvincia(AdmDivisionPolitica provincia) {
        this.provincia = provincia;
    }

    public AdmDivisionPolitica getCanton() {
        return canton;
    }

    public void setCanton(AdmDivisionPolitica canton) {
        this.canton = canton;
    }

    public AdmDivisionPolitica getParroquia() {
        return parroquia;
    }

    public void setParroquia(AdmDivisionPolitica parroquia) {
        this.parroquia = parroquia;
    }

   
    public List<CexAgenda> getListaHistorialTurnos() {
        return listaHistorialTurnos;
    }

    public void setListaHistorialTurnos(List<CexAgenda> listaHistorialTurnos) {
        this.listaHistorialTurnos = listaHistorialTurnos;
    }

 

    public AdmUsuario getAdmUsuario() {
        return admUsuario;
    }

    public void setAdmUsuario(AdmUsuario admUsuario) {
        this.admUsuario = admUsuario;
    }

  
    public List<CexAgenda> getListaAgenda() {
        return listaAgenda;
    }

    public void setListaAgenda(List<CexAgenda> listaAgenda) {
        this.listaAgenda = listaAgenda;
    }

   
    public UsuarioAdmin getUser() {
        return user;
    }

    public void setUser(UsuarioAdmin user) {
        this.user = user;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }
}
